class_name Unit extends Node2D

##父单位
@export var parent_unit : Unit
##是否要存档
@export var save_enable : bool = false
##单位ID
@export var unit_meta_id : String
##一个子节点被添加到该单位中事件
signal child_unit_added(unit : Unit)
##一个子节点在单位中被移除事件
signal child_unit_removed(unit : Unit)

#身体位置
@onready var body_position : Node2D = $BodyPosition
#单位容器
@onready var child_unit_container : Node2D = $BodyPosition/ChildUnitContainer
#组件容器
@onready var _components_container : Node2D = $BodyPosition/ComponentsContainer
#身体精灵
@onready var body_sprite : UnitSprite = $BodyPosition/ComponentsContainer/BodySprite
#单位ID
var unit_id:String
#单位元数据
var unit_meta : UnitMeta
#组件类型索引
var _component_type_dict : Dictionary = {}
#组件称索引
var _component_name_dict : Dictionary = {}

func _ready() -> void:
	if unit_meta_id != '' && unit_meta == null:
		unit_meta = UnitMetaManager.get_unit_meta(unit_meta_id)
	#初始化组件
	var components = _components_container.get_children()
	for component in components:
		if "owner_unit" in component:
			component.owner_unit = self
		_index_component(component)
	for component in components:
		if component.has_method("_unit_ready"):
			component.call("_unit_ready")

#设置单位位置
func set_unit_position(target_position : Vector2):
	var position_proxy = get_first_component_by_type(Enums.COMPONENT_TYPE.MOVEMENT_PROXY)
	if position_proxy:
		position_proxy.global_position = target_position
	else:
		global_position = target_position

#添加子单位
func add_child_unit(unit : Unit):
	child_unit_container.add_child(unit)
	unit.parent_unit = self
	emit_signal("child_unit_added", unit)

#删除子单位
func remove_child_unit(unit : Unit):
	child_unit_container.remove_child(unit)
	emit_signal("child_unit_removed", unit)

#获取所有子单位
func get_child_units() -> Array:
	return child_unit_container.get_children()
	
#根据组件名称获取组件(该单位不包含组件时,将返回null)
func get_component_by_name(component_name : String):
	return _component_name_dict[component_name]
	
#根据件类型获取组件列表(该单位不包含组件时,将返回空列表)
func get_components_by_type(component_type : Enums.COMPONENT_TYPE):
	if _component_type_dict.has(component_type):
		return _component_type_dict[component_type]
	return []
	
#根据组件型获取组件(该单位不包含组件时,将返回null)
func get_first_component_by_type(component_type : Enums.COMPONENT_TYPE):
	if _component_type_dict.has(component_type):
		return _component_type_dict[component_type][0]
	return null

#根据路径获取组件
func get_component_by_path(path : String):
	return _components_container.get_node(path)
	
#动态添加组件
func add_component(component:Node):
	_components_container.add_child(component)
	_index_component(component)
	
#添加一个组件到索引中
func _index_component(component:Node):
	if "component_type_list" in component && component.component_type_list != null:
		for component_type in component.component_type_list:
			if !_component_type_dict.has(component_type):
				_component_type_dict[component_type] = []
			_component_type_dict[component_type].append(component)
	if "component_name" in component && component.component_name != null:
		_component_name_dict[component.component_name] = component
